import axios from 'axios'
import store from '@/store'
import NProgress from 'nprogress'
import {hideLoading, showLoading} from '@/utils/requests/Loading'
import {server as apis} from "@/setting"
axios.defaults.withCredentials = true

export const baseUrl = process.env.NODE_ENV === 'production' ? apis.production : apis.development

/**
 * @function
 * @description axios二次封装函数,用于向服务器发送网络请求
 * @param {{url: String, params: Object, headers: String, timeout: Number, responseType: String, getHeader: Boolean, noJson: (Number|Boolean)}} options 配置对象
 * @param {'GET' | 'POST'} options.method 发送请求的方法，例，get/post
 * @param {String} options.url 请求接口地址
 * @param {Object} options.data data数据
 * @param {Object} options.params params数据
 * @param {String} options.headers 设置请求头
 * @param {Number} options.timeout 设定超时时间
 * @param {String} options.responseType 返回数据类型
 * @param {Boolean} options.getHeader 返回的数据是否需要携带响应头
 * @param {Number | Boolean} options.noJson 是否取消json格式的数据转换，默认发送json格式数据，配置该属性为 1 或 true,则以标准参数模式发送数据
 * @return {Promise}
 * */
export const request = (options) => {
  return new Promise((resolve, reject) => {
    axios({
      method: options.method,
      url: `${baseUrl}${options.url}`,
      data: options.data,
      timeout: 6000,
      responseType: options.responseType?options.responseType:'json',
      params: options.params,
      transformRequest: [function (data) {
        if (options.noJson) { // 判断是否json格式或者是表单提交形式
          let ret = '';
          for (let it in data) {
            ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
          }
          return ret // 便于直接取到内部data
        }
        return JSON.stringify(data)
      }],
      headers: {
        // 认证和请求方式
        'Content-Type': options.noJson? 'application/x-www-form-urlencoded':'application/json',
        'token': store.getters.getToken,
        ...options.headers,
      }
    }).then(res => {
      if (options.getHeader) {
        resolve(res)
      }else{
        resolve(res.data)
      }
    }).catch(err => {
      reject(err.msg)
    })
  })
};

/**
 * @function
 * @description requests封装函数,用于向服务器发送post网络请求
 * @param {Object} options 配置对象
 * @param {String} options.url 请求接口地址
 * @param {Object} options.params 需要发送的数据
 * @param {String} options.headers 设置请求头
 * @param {Number} options.timeout 设定超时时间
 * @param {String} options.responseType 返回数据类型 responseType可以设置响应的数据类型为一个包含二进制数据的 Blob 对象,用于下载流文件
 * @param {Boolean} options.getHeader 返回的数据是否需要携带响应头
 * @param {Number | Boolean} options.noJson 是否取消json格式的数据转换，默认发送json格式数据，配置该属性为 1 或 true,则以标准参数模式发送数据
 * @return {Promise}
 * */
export const post = (options) => {
  options['method'] = 'POST'
  options['data'] = options.params
  options['params'] = null
  return request(options)
};

/**
 * @function
 * @description requests封装函数,用于向服务器发送get网络请求
 * @param {Object} options 配置对象
 * @param {String} options.url 请求接口地址
 * @param {Object} options.params 需要发送的数据
 * @param {String} options.headers 设置请求头
 * @param {Number} options.timeout 设定超时时间
 * @param {String} options.responseType 返回数据类型 responseType可以设置响应的数据类型为一个包含二进制数据的 Blob 对象,用于下载流文件
 * @param {Boolean} options.getHeader 返回的数据是否需要携带响应头
 * @param {Number | Boolean} options.noJson 是否取消json格式的数据转换，默认发送json格式数据，配置该属性为 1 或 true,则以标准参数模式发送数据
 * @return {Promise}
 * */
export const get = (options) => {
  options['method'] = 'GET'
  options['data'] = null
  return request(options)
};

// uploadFileRequest  文件上传
export const uploadFileRequest = (url, data) => {
  return new Promise((resolve,reject) => {
    axios({
      method: 'post',
      url: `${baseUrl}${url}`,
      data: data,
      headers: {
        'Content-Type': 'multipart/form-data',
        'token': localStorage.getItem('token'),
        'authorization': 'admin'
      }
    }).then(res => {
      resolve(res.data)
    }).catch(err => {
      reject(err.msg)
    })
  })
};

// 使用拦截器添加加载动画
axios.interceptors.request.use(
  config => {
    showLoading()
    NProgress.start();
    return config
  },
  err => {
    showLoading()
    NProgress.done();
    return Promise.reject(err)
  }
);
// 关闭加载动画
axios.interceptors.response.use(
  response => {
    hideLoading()
    NProgress.done();
    // console.log(response.headers)
    return response;
  },
  error => {
    hideLoading()
    NProgress.done();
    return error.response;
  }
);
